/*
	*@brief			:默认情况下，当线程终止时，其它线程可以通过调用 pthread_join()获取其返回状态、回收线程资源，有时，程序员并不关系线程的返回状态，
					只是希望系统在线程终止时能够自动回收线程资源并将其移除。在这种情况下，可以调用 pthread_detach()将指定线程进行分离

	*@param[thread]	:pthread_join()等待指定线程的终止，通过参数 thread（线程 ID） 指定需要等待的线程；

	*@return		:成功返回 0；失败将返回错误码。

	*@other			:一个线程既可以将另一个线程分离,一旦线程处于分离状态，就不能再使用 pthread_join()来获取其终止状态，此过程是不可逆的，
					一旦处于分离状态之后便不能再恢复到之前的状态。处于分离状态的线程，当其终止后，能够自动回收线程资源。
 */
//int pthread_detach(pthread_t thread);

#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <string.h>

static void *new_thread_start(void *arg)
{
	int ret;

	ret=pthread_detach(pthread_self());
	if (ret)
	{
		fprintf(stderr,"pthread_detach error:%s\n",strerror(ret));
	}

	puts("新线程分离开始执行");

	sleep(2);

	puts("新线程终止");

	pthread_exit((void*)10);
}

int main(void)
{
	pthread_t tid;
	void *tret;
	int ret;

	//申请一个线程
	ret = pthread_create(&tid, NULL, new_thread_start, NULL);
	if (ret)
	{
		fprintf(stderr,"pthread_create error:%s\n",strerror(ret));
		exit(-1);
	}

	//确保新线程执行了分离函数
	sleep(1);

	//回收一个线程
	ret = pthread_join(tid, &tret);
	if (ret)
	{
		fprintf(stderr,"pthread_join error:%s\n",strerror(ret));

		sleep(3);
	
		printf("新线程终止, code=%ld\n", (long)tret);

		pthread_exit(NULL);
	}
}